package br.edu.delta.controller;

import java.util.Arrays;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import br.edu.delta.enuns.EnumEstados;
import br.edu.delta.enuns.EnumStatusEntidade;
import br.edu.delta.exception.NegocioException;
import br.edu.delta.form.LeitorForm;
import br.edu.delta.model.Endereco;
import br.edu.delta.model.Leitor;
import br.edu.delta.service.LeitorService;

/**
 * <p>
 * <b>Title:</b> LeitorController
 * </p>
 * 
 * <p>
 * <b>Description:</b> LeitorController
 * </p>
 * 
 * <p>
 * <b>Company: </b>
 * </p>
 * 
 * @author Denis
 * 
 * @version 1.0.0
 */
@Named
@RequestScoped
public class LeitorController extends AppController {

	/** Atributo serialVersionUID. */
	private static final long serialVersionUID = -1L;

	/** Atributo ATIVADO_COM_SUCESSO. */
	private static final String ATIVADO_COM_SUCESSO = "Cadastro do Leitor ativado com sucesso!";

	/** Atributo SALVO_COM_SUCESSO. */
	private static final String SALVO_COM_SUCESSO = "Leitor salvo com sucesso!";

	/** Atributo DESATIVADO_COM_SUCESSO. */
	private static final String DESATIVADO_COM_SUCESSO = "Cadastro do Leitor desativado com sucesso!";

	/** Atributo service. */
	@Inject
	private LeitorService service;

	/** Atributo formulario. */
	@Inject
	private LeitorForm formulario;

	/**
	 * @see br.edu.delta.controller.AppController#iniciarDados()
	 */
	@Override
	public void iniciarDados() {
		
		this.getFormulario().setEntidade(new Leitor());
		
		this.getFormulario().setListaEstados(Arrays.asList(EnumEstados.values()));
		
		this.getFormulario().getListagemLeitores().getConsulta().setStatusEntidade(EnumStatusEntidade.ATIVO);

		this.getFormulario().setSituacaoSelecionada("ATIVO");
		
	}
	
	public String novo(){
		
		this.getFormulario().setEntidade(new Leitor());
		
		this.getFormulario().getEntidade().setEndereco(new Endereco());
		
		return "/paginas/leitor/inserir?faces-redirect=true";
	}
	
	public void carregarEndereco(){
		
		this.getFormulario().setEndereco(this.getFormulario().getEntidade().getEndereco());
	}

	/**
	 * Método responsável por preparar cadastro
	 * 
	 * @author Denis
	 * 
	 */
	public void prepararCadastro() {

		if (this.getFormulario().getEntidade().getId() == null) {

			this.getFormulario().setEntidade(new Leitor());
		} 
	}

	/**
	 * Método responsável por pesquisar
	 * 
	 * @author Denis
	 * 
	 */
	public void pesquisar() {

		final String status = this.getFormulario().getSituacaoSelecionada();

		this.getFormulario().getListagemLeitores().getConsulta().setStatusEntidade(status.equals("NULL") ? null : status.equals("ATIVO") ? EnumStatusEntidade.ATIVO : EnumStatusEntidade.INATIVO);

	}

	/**
	 * Método responsável por salvar o leitor
	 * 
	 * @author Denis
	 * 
	 * @return
	 */
	public String salvar() {

		try {
			
			this.getFormulario().getEntidade().setEndereco(this.getFormulario().getEndereco());

			this.getService().salvar(this.getFormulario().getEntidade());

			this.getFormulario().setEntidade(new Leitor());
			
			this.getFormulario().setEndereco(new Endereco());
			
			AppController.messageInfo(LeitorController.SALVO_COM_SUCESSO);

			return "/paginas/leitor/inicio";

		} catch (final NegocioException e) {

			AppController.messageError(e.getMessage());

			return null;
		}
	}

	/**
	 * Método responsável por desativar o leitor
	 * 
	 * @author Denis
	 * 
	 */
	public void desativar() {

		try {

			this.getService().desativar(this.getFormulario().getConsulta());

			AppController.messageInfo(LeitorController.DESATIVADO_COM_SUCESSO);

		} catch (final NegocioException e) {

			AppController.messageError(e.getMessage());
		}

	}

	/**
	 * Método responsável por ativar o leitor
	 * 
	 * @author Denis
	 * 
	 */
	public void ativar() {

		try {

			this.getService().ativar(this.getFormulario().getConsulta());

			AppController.messageInfo(LeitorController.ATIVADO_COM_SUCESSO);

		} catch (final NegocioException e) {

			AppController.messageError(e.getMessage());
		}

	}
	
	/**
	 * Retorna o valor do atributo <code>service</code>
	 * 
	 * @return <code>LeitorService</code>
	 */
	public LeitorService getService() {

		return this.service;
	}

	/**
	 * Retorna o valor do atributo <code>formulario</code>
	 * 
	 * @return <code>LeitorForm</code>
	 */
	public LeitorForm getFormulario() {

		return this.formulario;
	}

}
